//带溢出检测的加/减运算电路
//n:模块参数，整数，操作数的位数,默认值为8
//a，b：输入，位宽均为n，补码表示法表示的2个数
//sub:输入，sub=1，执行a-b，sub=0,执行a+b
//s:输出，位宽为n, 运算结果
//ovf:输出，ovf=0,无溢出，ovf=1,有溢出
module AddSub(a,b,sub,s,ovf);
  parameter n=8;
  input [n-1:0] a,b;
  input sub;
  output [n-1:0] s;
  output ovf;
  //ci:数值位最高位的进位输出
  //co:符号位的进位输出
  wire ci,co;
  assign ovf = ci ^ co;
  //非符号位相加
  Adder1 #(n-1) ai(a[n-2:0],b[n-2:0]^{n-1{sub}},sub,ci,s[n-2:0]);
  //符号位相加
  Adder1 #(1) ao(a[n-1],b[n-1]^sub,ci,co,s[n-1]);
endmodule

